package com.thinkcoder.service;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicLong;

/**
 * @Author : 商俊帅
 * @Date : 2021/4/5 12:19
 * @Description : 随机数集合
 */
public class Nonce {

    //写时复制一份副本,再添加新元素
    //ArrayList add操作缺点:  当添加元素之后，size还没有加加，如果此时另一个线程抢夺了cpu的资源，进行添加元素操作，size现在也是为0，然后之前的线程两个线程继续执行，结果就是有两个元素添加进去，但是当前容量为却是1
    private static List<Integer> list = new CopyOnWriteArrayList<>();

    //原子类,使用CAS无锁,比较交换最新值
    private static AtomicLong lastModifyTimeStamp = new AtomicLong();

    public static void updateLastModifyTimeStamp(Long timeStamp){
        lastModifyTimeStamp.set(timeStamp);
    }

    //超过token失效时间的nonce可以清除掉,因为已经有token失效时间控制这次请求是否有效
    //在新的nonce到来时,判断nonce集合最后一次修改时间,超过token失效时间则清空该集合,不浪费内存
    public static void clearList(long tokenExpireTime){
        long lastModifyTime = lastModifyTimeStamp.get();
        if(lastModifyTime-System.currentTimeMillis()>tokenExpireTime){
            list.clear();
        }
    }

    public static boolean isHasNonce(Integer num){
        return list.contains(num);
    }

    public static void add(Integer nonce){
        list.add(nonce);
    }

    public static List<Integer> getList(){
        return list;
    }

    public static Long getLastModifyTime(){
        return lastModifyTimeStamp.get();
    }
}
